<?php

namespace origin;

/**
 * 随机类
 * @author dece <decezz@qq.com>
 */
class Random
{
    /**
     * 实例
     */
    public static $instance = null;

    /**
     * 构造
     */
    private function __construct()
    {
    }

    /**
     * 获取随机类的实例
     */
    public static function instance()
    {
        if (self::$instance == null) {
            self::$instance = new static();
        }
        return self::$instance;
    }

    /**
     * 获取权重 (方法一)
     * @param  array    $origin 数据数组
     * @param  string   $field  数组中权重字段
     * @return mixed    $res    取出的权重数据
     */
    public static function get_weight( array $origin , string $field = 'weight' )
    {
        if (count($origin) <= 0) {
            return $origin;
        }
        // 起始值
        $i = 0;
        $array = [];
        foreach ($origin as $key => $val) {
            $array[$key] = ['min' => $i];
            $i = ($i + $val[$field]) <= 0 ? 0 : ($i + $val[$field]) ;
            $array[$key]['max'] = $i;
        }
        // 随机生成一个数字
        $rand = mt_rand(1, ( $i == 0 ? 1 : $i ));
        // 取出权重数据
        foreach ($array as $ak => $av) {
            if ($av['min'] < $rand && $rand <= $av['max']) {
                $i = $ak;
                break;
            }
        }
        return $origin[$i];
    }

    /**
     * 获取权重 (方法二)
     * @param  array    $origin 数据数组
     * @param  string   $field  数组中权重字段
     * @return mixed    $res    取出的权重数据
     */
    public static function get_weight_two( array $origin , string $field = 'weight' )
    {
        if (count($origin) <= 0) {
            return $origin;
        }
        $array = [];
        foreach ($origin as $val) {
            for ($i = 0; $i < $val[$field]; $i++) { 
                $array[] = $val;
            }
        }
        // 随机生成一个数字
        $rand = mt_rand(0, count($array) - 1);
        // 取出权重数据
        return $array[$rand];
    }
}